/**
 * RealtimeDiskIO 组件专用工具函数
 * 处理实时磁盘IO数据连接相关逻辑
 */

import { ref, type Ref } from 'vue'
import type { RealTimeDiskIOData, RealTimeDiskIOStat } from '@/types/disk'
import { getRealTimeDiskIOData } from '@/api/disk'

/**
 * 实时数据连接状态管理
 */
export interface RealtimeConnectionState {
  isConnected: Ref<boolean>
  error: Ref<string | null>
  diskIOStats: Ref<RealTimeDiskIOStat[]>
  eventSource: Ref<EventSource | null>
}

/**
 * 创建实时数据连接管理器
 * @returns 实时连接状态和控制器
 */
export const useRealtimeDiskIOConnection = (): RealtimeConnectionState & {
  connect: () => void
  disconnect: () => void
} => {
  const diskIOStats = ref<RealTimeDiskIOStat[]>([])
  const eventSource = ref<EventSource | null>(null)
  const error = ref<string | null>(null)
  const isConnected = ref(false)

  /**
   * 建立实时数据连接
   */
  const connect = () => {
    try {
      console.log('开始连接实时磁盘IO数据...')

      // 检查浏览器是否支持EventSource
      if (!window.EventSource) {
        error.value = '浏览器不支持Server-Sent Events'
        console.error('浏览器不支持EventSource')
        return
      }

      // 关闭已存在的连接
      if (eventSource.value) {
        eventSource.value.close()
      }

      eventSource.value = getRealTimeDiskIOData()

      // 连接打开事件
      eventSource.value!.onopen = () => {
        console.log('SSE连接已建立')
        isConnected.value = true
        error.value = null
      }

      // 接收消息事件
      eventSource.value!.onmessage = (event) => {
        try {
          console.log('收到SSE消息:', event.data)
          const data: RealTimeDiskIOData = JSON.parse(event.data)
          console.log('解析后的数据:', data)

          if (data && data.disk_io_stats && Array.isArray(data.disk_io_stats)) {
            diskIOStats.value = data.disk_io_stats
            console.log(`成功更新 ${data.disk_io_stats.length} 个磁盘的IO数据`)
          } else {
            console.warn('数据格式不正确:', data)
          }

          error.value = null
        } catch (err) {
          console.error('解析实时数据失败:', err)
          console.error('原始数据:', event.data)
          error.value = `解析实时数据失败: ${err instanceof Error ? err.message : String(err)}`
        }
      }

      // 错误事件
      eventSource.value!.onerror = (err) => {
        console.error('实时数据连接错误:', err)
        console.error('连接状态:', eventSource.value?.readyState)

        isConnected.value = false
        error.value = '实时数据连接错误，正在重试...'

        // 如果是连接关闭，尝试重新连接
        if (eventSource.value?.readyState === EventSource.CLOSED) {
          console.log('连接已关闭，3秒后尝试重新连接...')
          setTimeout(() => {
            if (eventSource.value) {
              eventSource.value.close()
            }
            connect()
          }, 3000)
        }
      }
    } catch (err) {
      console.error('连接实时数据失败:', err)
      error.value = `连接实时数据失败: ${err instanceof Error ? err.message : String(err)}`
    }
  }

  /**
   * 断开实时数据连接
   */
  const disconnect = () => {
    console.log('断开实时数据连接')
    if (eventSource.value) {
      eventSource.value.close()
      eventSource.value = null
      isConnected.value = false
    }
  }

  return {
    diskIOStats,
    eventSource,
    error,
    isConnected,
    connect,
    disconnect,
  }
}

/**
 * 检查浏览器是否支持SSE
 * @returns 是否支持Server-Sent Events
 */
export const isSSESupported = (): boolean => {
  return typeof window !== 'undefined' && !!window.EventSource
}

/**
 * 获取SSE连接状态描述
 * @param readyState EventSource的readyState值
 * @returns 连接状态描述
 */
export const getSSEConnectionStatus = (readyState: number): string => {
  switch (readyState) {
    case EventSource.CONNECTING:
      return '连接中'
    case EventSource.OPEN:
      return '已连接'
    case EventSource.CLOSED:
      return '已关闭'
    default:
      return '未知状态'
  }
}
